<?  
 /** 
* @generator Le Classificateur 2.01 beta 
* @author Yann Boisclair-Roy 
* @date 2008/02/27
* @desc Classe qui contrôle les données de la table votes
*/  
 
 class Vote {

 	/**
 	* @desc Flag qui détermine si la recherche devra se faire avec des LIKE '%%' ou des " = "
 	* @var boolean
 	*/
 	var $rechercheExact = true; 
 
 	/**
 	* @desc Objet de connexion à la base de données
 	* @var Bd
 	*/
 	var $oBd; 
 	/**
 	* @desc Variable qui contient un bout de SQL qui déterminera l'ordre selon les voeux de l'usager
 	* @var string
 	*/
 	var $ordre; 
 	/**
 	* @desc Variable qui contient un bout de SQL qui déterminera la limite selon les voeux de l'usager
 	* @var String
 	*/
 	var $limite; 
 	/**
 	* @desc Variable qui contient un Array des résultats provenant de la requête SQL par GetInfos
 	* @var Array
 	*/
 	var $resultat; 
 	/**
 	* @desc Variables équivalente au champs noMontagne de la table votes
 	* @var int
 	*/
 	 var $noMontagne;
 
 	/**
 	* @desc Variables équivalente au champs noUsager de la table votes
 	* @var int
 	*/
 	 var $noUsager;
 
 	/**
 	* @desc Variables équivalente au champs noCritere de la table votes
 	* @var int
 	*/
 	 var $noCritere;
 
 	/**
 	* @desc Variables équivalente au champs note de la table votes
 	* @var int
 	*/
 	 var $note;
	 
	 var $paramBD;
 

 	/**
 	* @desc Constructeur de la class votes. Si à l'instenciation de la classe on lui donne un numéro de clé primaire, 
 	*  celle-ci instenciera la class avec toutes les infos dans la table votes concernant cette clé primaire.
 	* @access public
 	* @param	Bd	oBd
 	* @param int noMontagne
 	*/
 	 function Vote ( $oBd, $noMontagne = 0 ) { 
 	 	 $this->oBd = $oBd; 
  	 	 if( $noMontagne > 0 ) {  
  	 	 	 $this->noCritere = $noMontagne; 
  	 	 	 $this->getInfos(); 
  	 	 } 
 	 }  
 
   	/**
 	* @desc Fonction mutatrice du champ noMontagne
 	* @access public
 	* @param intnoMontagne
 	*/
	function setNoMontagne ( $noMontagne ) {
		$this->noMontagne = intval( $noMontagne );
	}


 	/**
 	* @desc Fonction accesseur du champ noMontagne
 	* @access public
 	* @return int
 	*/
	 function getNoMontagne (){
	 	 return stripslashes( noMontagne);
	}


 	/**
 	* @desc Fonction mutatrice du champ noUsager
 	* @access public
 	* @param intnoUsager
 	*/
	function setNoUsager ( $noUsager ) {
		$this->noUsager = intval( $noUsager );
	}


 	/**
 	* @desc Fonction accesseur du champ noUsager
 	* @access public
 	* @return int
 	*/
	 function getNoUsager (){
	 	 return stripslashes( noUsager);
	}


 	/**
 	* @desc Fonction mutatrice du champ noCritere
 	* @access public
 	* @param intnoCritere
 	*/
	function setNoCritere ( $noCritere ) {
		$this->noCritere = intval( $noCritere );
	}


 	/**
 	* @desc Fonction accesseur du champ noCritere
 	* @access public
 	* @return int
 	*/
	 function getNoCritere (){
	 	 return stripslashes( noCritere);
	}


 	/**
 	* @desc Fonction mutatrice du champ note
 	* @access public
 	* @param intnote
 	*/
	function setNote ( $note ) {
		$this->note = intval( $note );
	}


 	/**
 	* @desc Fonction accesseur du champ note
 	* @access public
 	* @return int
 	*/
	 function getNote (){
	 	 return stripslashes( note);
	}


 	/**
 	* @desc Fonction mutatrice de la limite
 	* @access public
 	* @param string limite
 	*/
 	 function setLimite( $limite ) {  
 	 	 $this->limite =  $limite;  
 	 }  
 
   	/**
 	* @desc Fonction mutatrice de l'ordre
 	* @access public
 	* @param string ordre
 	*/
 	 function setOrdre( $ordre ) {  
 	 	 $this->ordre =  $ordre;  
 	 }  
 
   	/**
 	* @desc Fonction mutatrice de resultats
 	* @access public
 	* @return Array Resultats
 	*/
 	 function getResultats() {  
 	 	 return $this->resultats;
 	 }  
 
   	/**
 	* @desc Fonction d'ajout et de mise à jour des données.
 	* @access public
 	* @return int
 	*/
	 function sauvegarde() { 
  		 if( empty( $this->noCritere ) ) { 
 			 $req = "INSERT INTO votes ( noMontagne, noUsager, noCritere, note 	)  VALUES  ( " . $this->noMontagne . ", " . $this->noUsager . ", " . $this->noCritere . ", " . $this->note . ") ON DUPLICATE KEY UPDATE noMontagne = " . $this->noMontagne . ", noUsager = " . $this->noUsager . ", noCritere = " . $this->noCritere . ", note = " . $this->note . ""; 
  			 $this->oBd->query( $req );
 			 $no = $this->oBd->getId(); 
 			 $this->noCritere = $no; 
 		 } else { 
 			 $req = "UPDATE votes SET noMontagne = " . $this->noMontagne . ", noUsager = " . $this->noUsager . ", noCritere = " . $this->noCritere . ", note = " . $this->note . " WHERE noCritere = " . $this->noCritere;
 			 $this->oBd->query( $req );
 			 $no = $this->noCritere;
 		 }
 		 return $no;  
 	 }  
  
  	/**
 	* @desc Fonction de recherche de données
 	* @access public
 	* @param string champs
 	*/
 	 function getInfos( $champs = "*" ) {
  		$variables = array( 'noMontagne','noUsager','noCritere','note'); 
  		 $trouve = false; 
 		 $recherche = ' 1 = 1 '; 
 		 $operateurDebut = " = '"; 
 		 $operateurFin = "'"; 
 		 if( !$this->rechercheExact ) {  
  			 $operateurDebut = " LIKE '%"; 
  			 $operateurFin = "%'"; 
  		 }  
  		 for ( $i = 0; $i < count( $variables ); $i++ ) { 
 			if ( !empty( $this->$variables[ $i ] ) ) {  
 				 $trouve = true; 
 				 /* Ajout de l'opérateur */ 
  				 if ( !empty( $recherche ) ) { 
 					 $recherche .= " AND "; 
 				 } 
  				 $variable = $variables[ $i ];
 				 $tableau = $this->$variable;
 				 $valeur = $tableau;
 				 /* Concaténation des critères de recherche */ 
  				 if ( is_numeric( $valeur ) ) { 
 					 $recherche .= "votes." . $variables[ $i ] . " = " . $valeur. " "; 
 				 } else { 
 					 $recherche .= "votes." . $variables[ $i ] . $operateurDebut . addslashes( $valeur ) . $operateurFin; 
 				 } 
  			 } 
  		 } 
		 $req = "SELECT " . $champs . " FROM votes WHERE " . $recherche . $this->ordre . $this->limite;
		 //echo $req;
  		 $infos = $this->oBd->query( $req ); 
 		 $this->resultats = $infos;
 		 $this->cleanup();
 		 for ( $i = 0; $i < count( $infos ); $i++ ) { 
	 	 	$this->noMontagne = $infos[ $i ][ 'noMontagne'] ; 
	 	 	$this->noUsager = $infos[ $i ][ 'noUsager'] ; 
	 	 	$this->noCritere = $infos[ $i ][ 'noCritere'] ; 
	 	 	$this->note = $infos[ $i ][ 'note'] ; 
 		 } 
  	} 
  	/**
 	* @desc Fonction de suppression des données.
 	* @access public
 	*/
 	function delete() {
 		 $req = "DELETE FROM votes WHERE noCritere = " . $this->noCritere; 
  		 $this->oBd->query( $req );
 	 } 

 	/**
 	* @desc Indique si la recherche dois etre exact ou pas ( true = LIKE '%x%' )" ),
 	* @access public
 	*/
 	 function setRechercheExact( $b ) {  
 	 	 $this->rechercheExact =  $b;  
 	 }  
 
   	/**
 	* @desc Fonction remet les variables membres à zéro
 	* @access private
 	*/
 	 function cleanup() { 
 	 	$this->noMontagne = array(); 
  	 	$this->noUsager = array(); 
  	 	$this->noCritere = array(); 
  	 	$this->note = array(); 
  	 }  
	 
	 function afficheEtoile( $div, $noMontagne, $noUsager, $noCritere, $valeur ) {
			$etoile = "<div id=\"" . $div . "\">";
				$etoile .= "<ul class=\"star-rating\">";
					$etoile .= "<li class=\"current-rating\" style=\"width:" . ( $valeur * 2  ) * 10 . "%;\"></li>";
					$etoile .= "<li><a onClick=\"envoiVote( '" . $div . "', " . $noMontagne . ", " . $noUsager . "," . $noCritere . "," . 1 . " );\" title=\"1 étoile sur 5 (très faible)\" class=\"one-star\">1</a></li>";
					$etoile .= "<li><a onClick=\"envoiVote( '" . $div . "', " . $noMontagne . ", " . $noUsager . "," . $noCritere . "," . 2 . " );\" title=\"2 étoiles sur 5 (faible)\" class=\"two-stars\">2</a></li>";
					$etoile .= "<li><a onClick=\"envoiVote( '" . $div . "', " . $noMontagne . ", " . $noUsager . "," . $noCritere . "," . 3 . " );\" title=\"3 étoiles sur 5 (moyen)\" class=\"three-stars\">3</a></li>";
					$etoile .= "<li><a onClick=\"envoiVote( '" . $div . "', " . $noMontagne . ", " . $noUsager . "," . $noCritere . "," . 4 . " );\" title=\"4 étoiles sur 5 (bon)\" class=\"four-stars\">4</a></li>";
					$etoile .= "<li><a onClick=\"envoiVote( '" . $div . "', " . $noMontagne . ", " . $noUsager . "," . $noCritere . "," . 5 . " );\" title=\"5 étoiles sur 5 (très bon)\" class=\"five-stars\">5</a></li>";
				$etoile .= "</ul>";
			$etoile .= "</div>";
			return $etoile;
		}
		
		function addVote( $noMontagne, $noUsager, $noCritere, $valeur ) {
			$connexion = $this->__connect_special();
			mysqli_query( $connexion, "call addVote(" . $noMontagne . "," . $noUsager . "," . $noCritere . "," . $valeur . ")" ) or die( mysqli_error( $connexion ) );
		}
		
		private function __connect_special() {
			$connexion = mysqli_connect( $this->paramBD[ 'host' ], $this->paramBD[ 'user' ], $this->paramBD[ 'pass' ] );
			mysqli_select_db( $connexion, $this->paramBD[ 'bd' ] );
			return $connexion;	
		}
		
		function setParam( $param ) {
			$this->paramBD = $param;
		}
		
		function getClassementGeneral() {
			$req = "SELECT montagnes.noMontagne, montagnes.nom, AVG( note ) as quote FROM votes LEFT JOIN montagnes ON votes.noMontagne = montagnes.noMontagne GROUP BY votes.noMontagne ORDER BY quote  DESC";
			return $this->oBd->query( $req );
		}
		
		function getMoyenneMontagneCategorie() {
			/* vas chercher les catégorie de critere */
			$req = "SELECT * FROM votes LEFT JOIN criteres ON votes.noCritere = criteres.noCritere ORDER BY noMontagne ASC";
			$tab = $this->oBd->query( $req );
			$tabPoint = array();
			foreach( $tab as $vote ) {
				$tabPoint[ $vote[ 'noMontagne' ]][ $vote[ 'categorieCritere' ] ][ 'totalNote' ] += $vote[ 'note' ];
				$tabPoint[ $vote[ 'noMontagne' ]][ $vote[ 'categorieCritere' ] ][ 'nbVote' ] += 1;
			}
			return $tabPoint;
		}
		
		function getClassement() {
			$req = "SELECT 
						vue_pointage.nbVotes,
						vue_pointage.moyenne,
						categorieCritere.categorie,
						montagnes.nom,
                        vue_classement.moyenne as moyenneGlobal,
                        vue_classement.nbVotes as nbVoteGlobal
					FROM 
						vue_pointage INNER JOIN
						montagnes ON vue_pointage.noMontagne = montagnes.noMontagne INNER JOIN
                        vue_classement ON vue_classement.noMontagne = montagnes.noMontagne INNER JOIN 
						categorieCritere ON categorieCritere.noCategorieCritere = vue_pointage.noCritere
					ORDER BY vue_classement.moyenne DESC";
			return $this->oBd->query( $req );
		}
        
        function getClassementGlobal() {
            $req = "SELECT 
                        vue_classement.nbVotes,
                        vue_classement.moyenne,
                        montagnes.nom
                    FROM 
                        vue_classement INNER JOIN
                        montagnes ON vue_classement.noMontagne = montagnes.noMontagne 
                    ORDER BY vue_classement.moyenne DESC ";
            return $this->oBd->query( $req );
        }
 
  }
?>